package ge.escola;

import ge.util.Validadores;

/**
 * 
 * Classe que molda um laboratorio de informatica.
 * 
 */
public class Laboratorio {
	private String nomeDoLaboratorio;
	private int numeroDeComputadores;
	private int capacidadeDeAlunos;
	private String horarioDeFuncionamentoInicial;
	private String horarioDeFuncionamentoFinal;

	/**
	 * 
	 * @param nomeDoLaboratorio
	 *            String que representa o nome do laboratorio.
	 * @param numeroDeComputadores
	 *            Inteiro que representa o numero de computadores do
	 *            laboratorio.
	 * @param capacidadeDeAlunos
	 *            Inteiro que representa a capacidade de alunos no laboratorio.
	 * @param horarioDeFuncionamentoInicial
	 *            Horario que representa o horario em que o laboratorio comeca a
	 *            funcionar.
	 * @param horarioDeFuncionamentoFinal
	 *            Horario que representa o horario em que o laboratorio serah
	 *            fechado.
	 * @throws Exception
	 *             Caso o numero de computadores ou de alunos seja negativo, o
	 *             horario ou nome seja invalido.
	 */
	public Laboratorio(String nomeDoLaboratorio, int numeroDeComputadores,
			int capacidadeDeAlunos, String horarioDeFuncionamentoInicial,
			String horarioDeFuncionamentoFinal) throws Exception {

		if ((nomeDoLaboratorio.replace(" ", "").length() < 1)
				|| (nomeDoLaboratorio.equals(""))
				|| (nomeDoLaboratorio == null)) {
			throw new Exception("Nome do laboratorio invalido !");

		}
		if (numeroDeComputadores < 0) {
			throw new Exception(
					"Numero de computadores no laboratorio invalido !");
		}
		if (capacidadeDeAlunos < 0) {
			throw new Exception(
					"Capacidade de alunos no laboratorio invalida !");
		}

		if (!(Validadores.validaHora(horarioDeFuncionamentoInicial))
				|| !(Validadores.validaHora(horarioDeFuncionamentoFinal))) {
			throw new Exception("Horario de funcionamento invalido !");
		}

		this.nomeDoLaboratorio = nomeDoLaboratorio;
		this.numeroDeComputadores = numeroDeComputadores;
		this.capacidadeDeAlunos = capacidadeDeAlunos;
		this.horarioDeFuncionamentoInicial = horarioDeFuncionamentoInicial;
		this.horarioDeFuncionamentoFinal = horarioDeFuncionamentoFinal;

	}

	/**
	 * @param nomeDoLaboratorio
	 *            String que representa o nome do laboratorio.
	 * @param numeroDeComputadores
	 *            Inteiro que representa o numero de computadores do
	 *            laboratorio.
	 * @param capacidadeDeAlunos
	 *            Inteiro que representa a capacidade de alunos no laboratorio.
	 * @throws Exception
	 *             Caso o numero de computadores ou de alunos seja negativo ou o
	 *             nome seja invalido.
	 */
	public Laboratorio(String nomeDoLaboratorio, int numeroDeComputadores,
			int capacidadeDeAlunos) throws Exception {

		if ((nomeDoLaboratorio.replace(" ", "").length() < 1)
				|| (nomeDoLaboratorio.equals("")) || nomeDoLaboratorio == null) {
			throw new Exception("Nome do laboratorio invalido !");

		}
		if (numeroDeComputadores < 0) {
			throw new Exception(
					"Numero de computadores no laboratorio invalido !");
		}
		if (capacidadeDeAlunos < 0) {
			throw new Exception(
					"Capacidade de alunos no laboratorio invalida !");
		}

		this.nomeDoLaboratorio = nomeDoLaboratorio;
		this.numeroDeComputadores = numeroDeComputadores;
		this.capacidadeDeAlunos = capacidadeDeAlunos;

	}

	/**
	 * 
	 * @return Nome do laboratorio.
	 */
	public String getNomeDoLaboratorio() {
		return nomeDoLaboratorio;
	}

	/**
	 * Modifica o nome do laboratorio.
	 */
	public void setNomeDoLaboratorio(String nomeDoLaboratorio) {
		this.nomeDoLaboratorio = nomeDoLaboratorio;
	}

	/**
	 * 
	 * @return Numero de computadores.
	 */
	public int getNumeroDeComputadores() {
		return numeroDeComputadores;
	}

	/**
	 * Modifica o numero de computadores do laboratorio.
	 */
	public void setNumeroDeComputadores(int numeroDeComputadores)
			throws Exception {
		if (numeroDeComputadores < 0)
			throw new Exception("Numero invalido !");
		this.numeroDeComputadores = numeroDeComputadores;
	}

	/**
	 * 
	 * @return Capcidade de alunos no laboratorio.
	 */
	public int getCapacidadeDeAlunos() {
		return capacidadeDeAlunos;
	}

	/**
	 * Modifica a capacidade de alunos do laboratorio.
	 */
	public void setCapacidadeDeAlunos(int capacidadeDeAlunos) throws Exception {
		if (capacidadeDeAlunos < 0)
			throw new Exception("Numero invalido !");
		this.capacidadeDeAlunos = capacidadeDeAlunos;
	}

	/**
	 * 
	 * @return Horario de funcionamento do laboratorio.
	 */
	public String getHorarioDeFuncionamentoInicial() {
		return horarioDeFuncionamentoInicial;
	}

	/**
	 * Modifica o horario de funcionamento do laboratorio.
	 */
	public void setHorarioDeFuncionamentoInicial(
			String horarioDeFuncionamentoInicial) throws Exception {
		if (!(Validadores.validaHora(horarioDeFuncionamentoInicial))) {
			throw new Exception("Horario invalido !");
		}
		this.horarioDeFuncionamentoInicial = horarioDeFuncionamentoInicial;
	}

	/**
	 * 
	 * @return Horario de funcionamento do laboratorio.
	 */
	public String getHorarioDeFuncionamentoFinal() {
		return horarioDeFuncionamentoFinal;
	}

	/**
	 * Modifica o horario de funcionamento do laboratorio.
	 */
	public void setHorarioDeFuncionamentoFinal(
			String horarioDeFuncionamentoFinal) throws Exception {
		if (!(Validadores.validaHora(horarioDeFuncionamentoFinal))) {
			throw new Exception("Horario invalido !");
		}
		this.horarioDeFuncionamentoFinal = horarioDeFuncionamentoFinal;
	}

	/**
	 * Retorna uma string que representa a classe laboratorio.
	 */
	public String toString() {
		String retorno = "";
		retorno = String
				.format("Nome do laboratorio: %s\nHorario de funcionamento: %s - %s\nNumero de computadores: %s\nCapacidade de alunos: %s",
						this.nomeDoLaboratorio,
						this.horarioDeFuncionamentoInicial,
						this.horarioDeFuncionamentoFinal,
						this.numeroDeComputadores, this.capacidadeDeAlunos);
		return retorno;
	}

	/**
	 * 
	 * @return True se dois laboratorios forem iguais, ou false se dois
	 *         laboratorios forem diferentes. Dois laboratorios sao iguais se
	 *         tiverem o mesmo nome.
	 */
	public boolean equals(Object laboratorio) {
		if (!(laboratorio instanceof Laboratorio))
			return false;
		Laboratorio laboratorio2 = (Laboratorio) laboratorio;
		if (!(laboratorio2.nomeDoLaboratorio
				.equalsIgnoreCase(this.nomeDoLaboratorio))) {
			return false;
		}
		return true;
	}
}
